// 登录态管理

// 从 pinia 库引入 defineStore，用于定义一个全局状态管理的 store
import { defineStore } from 'pinia';

// 封装存储 token 的方法，方便后续替换存储方案
function getTokenFromStorage() {
    return localStorage.getItem('token') || null;
}
function setTokenToStorage(token) {
    localStorage.setItem('token', token);
}
function removeTokenFromStorage() {
    localStorage.removeItem('token');
}

// 简单 JWT 校验（仅示范）：判断 token 是否过期，返回 true 表示有效，false 表示过期或无效
function isTokenValid(token) {
    if (!token) return false;
    try {
        // JWT 结构：header.payload.signature
        const payloadBase64 = token.split('.')[1];
        if (!payloadBase64) return false;
        const payloadJson = atob(payloadBase64);
        const payload = JSON.parse(payloadJson);
        // exp 是秒时间戳，判断是否过期
        if (payload.exp && Date.now() / 1000 > payload.exp) {
            return false;
        }
        return true;
    } catch (e) {
        // 解析失败也认为无效
        return false;
    }
}

export const useAuthStore = defineStore('auth', {
    state: () => ({
        token: getTokenFromStorage() // 初始化从本地取 token
    }),
    actions: {
        setToken(token) {
            this.token = token;
            setTokenToStorage(token);
        },
        clearToken() {
            this.token = null;
            removeTokenFromStorage();
        },
        // 异步初始化方法，启动时调用，做 token 校验和状态同步
        async initAuth() {
            const token = getTokenFromStorage();
            if (isTokenValid(token)) {
                this.token = token;
            } else {
                this.clearToken();
            }
        }
    }
});

// 监听 localStorage 变化，保持多个标签页的 token 状态同步
window.addEventListener('storage', event => {
    if (event.key === 'token') {
        const authStore = useAuthStore();
        if (event.newValue && isTokenValid(event.newValue)) {
            authStore.token = event.newValue;
        } else {
            authStore.token = null;
        }
    }
});
